﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Helpers;
using Capa_Dominio;
using Capa_Persistencia_NH;
using Capa_Persistencia_NH.Interface;
using Capa_Persistencia_NH.AccesoDatos;

namespace Capa_TestingProyects
{
    [TestFixture]
    public class Test1_Local
    {
        private ILocal adminLocal = null;
        
        int codigoGenerado = 0;
        Distrito objDistrito;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            DistritoDAO daoDistrito;
            adminLocal =  new LocalDAO();

            daoDistrito = new DistritoDAO();
            //foreach (Local local in adminLocal.ListarTodos())
            //    adminLocal.Eliminar(local);
            //Creamos  locales para tenerlos disponibles en las pruebas
           // adminLocal.Crear(new Local() { NombreLocal = "Monterrico",CodigoDistrito=1, Direccion = "Av. Primavera 123",Estado=true });

            objDistrito = daoDistrito.Obtener(1);
        }

        [Test]
        public void Test1_Crear()
        {
            Assert.IsNotNull(adminLocal);
            //se instancia a la entidad a crear
            Local objLocal = new Local();
            objLocal.NombreLocal = "Local UPC";
            objLocal.Distrito = objDistrito;
            objLocal.Direccion = "Monterrico al Costado de la UPC";
            objLocal.Estado = true;
            //se declara la entidad que se retornara
            Local localRetornado = null;
            //no aseguramos que no retorne una exepcion
            Assert.DoesNotThrow(delegate
            {
                localRetornado = adminLocal.Crear(objLocal);
                codigoGenerado = localRetornado.CodigoLocal;
            },"Local Generado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(localRetornado);
            //verificamos que el codigo generado sera mayor que 0
            Assert.Greater(codigoGenerado, 0);
        }


        [Test]
        public void Test2_Modificar()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(adminLocal);
            // 2. Declaramos e instanciamos la entidad de dominio
            Local localAModificar = adminLocal.Obtener(codigoGenerado);
            localAModificar.NombreLocal = "Local UPC";
            localAModificar.Distrito = objDistrito;
            localAModificar.Direccion = "Av. Parque de Las Leyendas 555";
            localAModificar.Estado = true;
            // 3. Declaramos la entidad que contendrá el resultado
            Local localModificado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                localModificado = adminLocal.Modificar(localAModificar);
            }, "local modificado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(localModificado);
            // Probamos que el código generado sea mayor a 0
            Assert.AreEqual(localModificado.CodigoLocal, codigoGenerado);
            // Probamos que el nombre registrado es igual al solicitado con la entidad
            Assert.AreEqual(localModificado.NombreLocal, localAModificar.NombreLocal);
            // Probamos que la dirección registrada es igual a la solicitada con la entidad
            Assert.AreEqual(localModificado.Direccion, localAModificar.Direccion);
        }

        [Test]
        public void Test3_Modificar_NoOK()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(adminLocal);
            // 2. Declaramos e instanciamos la entidad de dominio
            Local localAModificar = adminLocal.Obtener(codigoGenerado);
            localAModificar.CodigoLocal = -1;
            localAModificar.NombreLocal = "Monterrico";
            localAModificar.Distrito = objDistrito;
            localAModificar.Direccion = "Av. Primavera 123";
            localAModificar.Estado = true;

            // 3. Declaramos la entidad que contendrá el resultado
            Local localModificado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.Catch<Exception>(delegate
            {
                // 5. Ejecutamos el método a probar
                localModificado = adminLocal.Modificar(localAModificar);
            }, "Instrumento no modificado");
        }

        [Test]
        public void Test4_Eliminar()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(adminLocal);
            // 2. Definimos la entidad que contendrá el resultado
            Local localExistente = adminLocal.Obtener(codigoGenerado);
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                adminLocal.Eliminar(localExistente);
            });
            // Probamos que la entidad ya no existe
            Assert.IsNull(adminLocal.Obtener(codigoGenerado));
        }

        [Test]
        public void Test5_ListarXNombre()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(adminLocal);
            string nombreLocal = "Lince";
            // Declaramos la entidad que contendrá el resultado
            ICollection<Local> localEncontrados = null;
            //  Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                //  Ejecutamos el método a probar
                localEncontrados = adminLocal.ListarXNombre(nombreLocal);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(localEncontrados);
            // Probamos que la cantidad de locales encontrados sea igual o mayor que 1
            Assert.GreaterOrEqual(localEncontrados.Count, 1);
            // Probamos que cada local contenga la cadena de búsqueda
            foreach (Local localEncontrado in localEncontrados)
            {
                Assert.IsTrue(localEncontrado.NombreLocal.Contains(nombreLocal));
            }
        }

        [TestFixtureTearDown]
        public void TerminarPruebas()
        {
            NHibernateHelper.CerrarFabrica();
        }
    }
}
